<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2017/11/22/022
 * Time: 18:07
 */

namespace app\api\validate;


use think\Validate;
use think\facade\Request;
use app\api\exception\ParameterException;

class BaseValidate extends Validate {

    private $validateScene;

    /**
     * 公共验证方法
     * @param string $scene
     * @return bool
     * @throws ParameterException
     */
    public function goCheck($scene = '')
    {
        // 获取http传入的参数
        // 对这些参数做检验
        $params = Request::param();

        if ($scene) { // 如果有传递验证场景，就按场景验证
            $this->validateScene = $scene;
            $result = $this->scene($scene)->check($params);
        } else {
            $result = $this->check($params);
        }

        if (!$result)
        {
            $e = new ParameterException(
                [
                    'msg' => $this->error,
                ]);
            throw $e;
        }
        else
        {
            return true;
        }
    }

    /**
     * 验证是否正整数
     * @param $value
     * @param string $rule
     * @param string $data
     * @param string $field
     * @return bool
     */
    protected function isPositiveInteger(
        $value, $rule = '',
        $data = '', $field = '')
    {
        $value = (int)$value;
        if (is_numeric($value) && is_int($value + 0) && ($value + 0) > 0)
        {
            return true;
        }
        else
        {
            return false;
            //            return $field.'必须是正整数';
        }
    }

    /**
     * 验证是否手机号码
     * @param $value
     * @return bool
     */
    protected function isMobile($value)
    {
        $rule = '^1(3|4|5|7|8)[0-9]\d{8}$^';
        $result = preg_match($rule, $value);
        if ($result) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 验证是否为空
     * @param $value
     * @param string $rule
     * @param string $data
     * @param string $field
     * @return bool
     */
    protected function isNotEmpty($value, $rule = '', $data = '', $field = '')
    {
        if (empty($value))
        {
            return false;
        }
        else
        {
            return true;
        }
    }

    /**
     * 验证是否为浮点型或者正整数
     * @param $value
     * @return bool
     */
    protected function isFloatOrPositiveInteger($value) {
        if ($value < 0) {   // 不能小于0
            return false;
        }

        if ($value == 0) {   //  如果传0  表示使用默认值  验证通过
            return true;
        }

        if (is_float($value)) {   //  大于0的值先验证是不是浮点型
            return true;
        } else {
            //  不是浮点型在验证是不是正整数
            return $this->isPositiveInteger($value);
        }
    }

    /**
     * 根据验证规则获取参数
     * @param $arrays
     * @return array
     * @throws ParameterException
     */
    public function getDataByRule($arrays)
    {
        if (array_key_exists('member_id', $arrays) |
            array_key_exists('uid', $arrays)
        )
        {
            // 不允许包含user_id或者uid，防止恶意覆盖user_id外键
            throw new ParameterException(
                [
                    'msg' => '参数中包含有非法的参数名member_id或者uid'
                ]);
        }

        $newArray = [];

        if (!empty($this->validateScene)) {
            $rule = $this->scene[$this->validateScene];
            foreach ($rule as $key => $value)
            {
                $newArray[$value] = $arrays[$value];
            }
        } else {
            $rule = $this->rule;
            foreach ($rule as $key => $value)
            {
                $newArray[$key] = $arrays[$key];
            }
        }

        return $newArray;
    }

    /**
     * 验证身份证号码
     * @param $value
     * @return bool
     */
    protected function checkCardNo($value)
    {
        $IDCardBody = substr($value, 0, -1);
        $last_num = substr($value, -1);
        if (strlen($IDCardBody) != 17)
        {
            return false;
        }
        // 加权因子
        $factor = array(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2);
        // 校验码对应值
        $code = array('1','0','X','9','8','7','6','5','4','3','2');
        $checksum = 0;
        for($i = 0; $i < strlen($IDCardBody); $i++)
        {
            $checksum += substr($IDCardBody, $i, 1) * $factor[$i];
        }
        if ($code[$checksum % 11] == $last_num)
            return true;
        else
            return false;
    }
}